home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / getusershell.c < prev    next >
C/C++ Source or Header  |  1989-07-21  |  2KB  |  113 lines

  1. /*
  2.  * Copyright (c) 1985 Regents of the University of California.
  3.  * All rights reserved.  The Berkeley software License Agreement
  4.  * specifies the terms and conditions for redistribution.
  5.  */
  6.  
  7. #if defined(LIBC_SCCS) && !defined(lint)
  8. static char sccsid[] = "@(#)getusershell.c    5.4 (Berkeley) 7/25/86";
  9. #endif LIBC_SCCS and not lint
  10.  
  11. #include <sys/param.h>
  12. #include <sys/file.h>
  13. #include <sys/stat.h>
  14. #include <ctype.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17.  
  18. #define SHELLS "/etc/shells"
  19.  
  20. static char **initshells();
  21.  
  22. /*
  23.  * Do not add local shells here.  They should be added in /etc/shells
  24.  */
  25. static char *okshells[] =
  26.     { "/bin/sh", "/bin/csh", 0 };
  27.  
  28. static char **shells, *strings;
  29. static char **curshell = NULL;
  30. extern char **initshells();
  31.  
  32. /*
  33.  * Get a list of shells from SHELLS, if it exists.
  34.  */
  35. char *
  36. getusershell()
  37. {
  38.     char *ret;
  39.  
  40.     if (curshell == NULL)
  41.         curshell = initshells();
  42.     ret = *curshell;
  43.     if (ret != NULL)
  44.         curshell++;
  45.     return (ret);
  46. }
  47.  
  48. endusershell()
  49. {
  50.     
  51.     if (shells != NULL)
  52.         free((char *)shells);
  53.     shells = NULL;
  54.     if (strings != NULL)
  55.         free(strings);
  56.     strings = NULL;
  57.     curshell = NULL;
  58. }
  59.  
  60. setusershell()
  61. {
  62.  
  63.     curshell = initshells();
  64. }
  65.  
  66. static char **
  67. initshells()
  68. {
  69.     register char **sp, *cp;
  70.     register FILE *fp;
  71.     struct stat statb;
  72.     extern char *malloc(), *calloc();
  73.  
  74.     if (shells != NULL)
  75.         free((char *)shells);
  76.     shells = NULL;
  77.     if (strings != NULL)
  78.         free(strings);
  79.     strings = NULL;
  80.     if ((fp = fopen(SHELLS, "r")) == (FILE *)0)
  81.         return(okshells);
  82.     if (fstat(fileno(fp), &statb) == -1) {
  83.         (void)fclose(fp);
  84.         return(okshells);
  85.     }
  86.     if ((strings = malloc((unsigned)statb.st_size)) == NULL) {
  87.         (void)fclose(fp);
  88.         return(okshells);
  89.     }
  90.     shells = (char **)calloc((unsigned)statb.st_size / 3, sizeof (char *));
  91.     if (shells == NULL) {
  92.         (void)fclose(fp);
  93.         free(strings);
  94.         strings = NULL;
  95.         return(okshells);
  96.     }
  97.     sp = shells;
  98.     cp = strings;
  99.     while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
  100.         while (*cp != '#' && *cp != '/' && *cp != '\0')
  101.             cp++;
  102.         if (*cp == '#' || *cp == '\0')
  103.             continue;
  104.         *sp++ = cp;
  105.         while (!isspace(*cp) && *cp != '#' && *cp != '\0')
  106.             cp++;
  107.         *cp++ = '\0';
  108.     }
  109.     *sp = (char *)0;
  110.     (void)fclose(fp);
  111.     return (shells);
  112. }
  113.